创建时间: | 2019/1/14 20:51 |
来源: | https://blog.csdn.net/yjt13/article/details/82319740 |
小编在敲一个SSH项目的时候碰到了“lazy”属性,但是又对这个东西不熟悉,因为从来没有用到过,所以就去网上搜了一些相关资料,下面是小编总结的搜到的东西,也当作笔记留在博客,以便以后用到的时候可以更方便的参考
Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术。这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势。
但是,延迟加载也是项目开发中特别常见的一个错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。所以,在开发独立的DAO数据访问层时应该格外小心这个问题。
如果在获取对象的时候使用的是session.get()是不会延迟加载的,只有在使用load、hql时候才会延迟加载。当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的也是代理对象,所以在上面这几种场景下就是延迟加载。
当Hibernate从数据库中加载某个对象时,加载关联的对象,生成的实际对象,获取使用session中的get的方法获取到的是实际对象。
延迟加载策略能避免加载应用程序不需要访问的关联对象,以提高应用程序的性能。
Hibernate在查询某个对象时,立即查询与之关联的对象,我们可以看出这种加载策略存在两大不足:
如果程序加载一个持久化对象的目的是为访问他的属性,则可以采用立即加载。如果程序加载一个持久化对象的目的仅仅是为了获得他的引用,则可以采用延迟加载。
Hibernate中允许使用延迟加载的地方主要有以下几个地方:
上面就是小编本次对“lazy”属性所做的一些了解,由于小编比较菜,所以参考了大牛的博客,博客园等,链接在这里Hibernate Lazy属性 Hibernate之lazy延迟加载(转)